from agno.models.openai import OpenAILike

from configs.basic_config import ALI_GENERATION_MODEL, AGENT_URL, ALI_DASHSCOPE_API_KEY
from textwrap import dedent
from typing import Dict, List, Optional

from agno.agent import Agent
#from agno.tools.firecrawl import FirecrawlTools
from agno.tools.crawl4ai import Crawl4aiTools
from pydantic import BaseModel, Field
from rich.pretty import pprint


class ContentSection(BaseModel):
    """表示网页的内容部分。"""

    heading: Optional[str] = Field(None, description="章节标题")
    content: str = Field(..., description="章节内容文本")


class PageInformation(BaseModel):
    """网页的结构化表示。"""

    url: str = Field(..., description="页面的 URL")
    title: str = Field(..., description="页面的标题")
    description: Optional[str] = Field(
        None, description="页面的元描述或摘要"
    )
    features: Optional[List[str]] = Field(None, description="关键功能列表")
    content_sections: Optional[List[ContentSection]] = Field(
        None, description="页面的主要内容部分"
    )
    links: Optional[Dict[str, str]] = Field(
        None, description="页面上找到的重要链接及其描述"
    )
    contact_info: Optional[Dict[str, str]] = Field(
        None, description="可用的联系信息"
    )
    metadata: Optional[Dict[str, str]] = Field(
        None, description="页面的重要元数据"
    )


agent = Agent(
    # --- 修改模型参数 ---
    model=OpenAILike(id=ALI_GENERATION_MODEL, name=ALI_GENERATION_MODEL, api_key=ALI_DASHSCOPE_API_KEY, base_url=AGENT_URL),
    tools=[Crawl4aiTools()],
    instructions=dedent("""
        你是一位专业的网页研究员和内容提取专家。请从提供的网页中提取全面且结构化的信息。
        重点关注以下内容：

        1. 准确捕获页面标题、描述和关键功能
        2. 识别并提取带有标题的主要内容部分
        3. 找到指向相关页面或资源的重要链接
        4. 定位可用的联系信息
        5. 提取能提供网站背景信息的相关元数据

        请做到详尽但简洁。如果页面内容非常丰富，请优先提取最重要的信息。
    """).strip(),
    response_format={"type": "json_object"},
    output_schema=PageInformation,
)

result = agent.run("从 https://www.agno.com 提取所有信息")
pprint(result.content)